package com.forum.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.forum.common.Result;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;

public class AuthInterceptor implements HandlerInterceptor {

    // 请求白名单：白名单中的请求不需要校验 token，支持前缀匹配
    private static final List<String> WHITE_LIST = Arrays.asList(
            "/api/user/login",
            "/api/user/register",
            "/files/"
    );

    // JWT 密钥（请和登录时使用的相同，建议存放在配置文件中）
    @Value("${jwt.JWT_SECRET}")
    private String JWT_SECRET;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        // 白名单检测：白名单中的 URI 直接放行
        for (String white : WHITE_LIST) {
            if (uri.startsWith(white)) {
                return true;
            }
        }

        // 获取请求头中的 token（假设 token 格式为 "Bearer xxx"）
        String token = request.getHeader("Authorization");
        if (token == null || token.trim().isEmpty()) {
            writeError(response, "未提供Authorization令牌");
            return false;
        }
        // 去掉 "Bearer " 前缀（如果存在）
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }

        try {
            // 使用 JWT 解析 token
            Claims claims = Jwts.parser()
                    .setSigningKey(this.JWT_SECRET)
                    .parseClaimsJws(token)
                    .getBody();
            // 如需要，可以把 claims 保存到 request 属性供后续使用
            request.setAttribute("claims", claims);
            return true;
        } catch (Exception e) {
            writeError(response, "无效的token：" + e.getMessage());
            return false;
        }
    }

    // 写出统一错误信息
    private void writeError(HttpServletResponse response, String errorMsg) throws Exception {
        response.setContentType("application/json;charset=utf-8");
        Result<?> result = Result.fail(errorMsg);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(result);
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter out = response.getWriter();
        out.write(json);
        out.flush();
        out.close();
    }
}
